import pandas as pd
from sklearn.cluster import KMeans
from matplotlib import pyplot as plt
# 读取Excel文件
excel_file_path = 'D:/BaiduNetdiskDownload/美赛赛题合集/2023年美赛赛题/2023/第一问/output.xlsx'  #文件路径
df = pd.read_excel(excel_file_path)
# 选择要聚类的特征列
features = df[['困难占比']]  # 替换为您的特征列名

# 计算不同聚类数目的SSE
sse = []
for k in range(2, 12):  # 尝试1到10个聚类
    kmeans = KMeans(n_clusters=k, random_state=0)
    kmeans.fit(features)
    sse.append(kmeans.inertia_)  # inertia_属性存储了SSE

# 绘制手肘图
plt.figure(figsize=(4, 6))
plt.plot(range(2, 12), sse, marker='o')
plt.title('Elbow Method')
plt.xlabel('Number of Clusters')
plt.ylabel('SSE')
plt.show()


# 创建KMeans聚类模型
kmeans = KMeans(n_clusters=4, random_state=0)  # 替换为您希望的聚类数量

# 进行聚类
kmeans.fit(features)

# 将聚类结果添加到原始数据中
df['clusters'] = kmeans.labels_
#保存结果
df.to_excel('D:/BaiduNetdiskDownload/美赛赛题合集/2023年美赛赛题/2023/第一问/output.xlsx', index=False)
# 输出聚类结果
print(df)

# 可视化聚类结果 - 直方图
plt.figure(figsize=(12, 8))
for cluster in df['clusters'].unique():
    cluster_data = df[df['clusters'] == cluster]['困难占比']
    plt.hist(cluster_data, bins=20, alpha=0.5, label=f'Cluster {cluster}')

plt.title('Histogram of difficulty ratio by Clusters')
plt.xlabel('ratio')
plt.ylabel('Frequency')
plt.legend(title='Clusters')
plt.grid(True)
plt.show()